iT邦幫忙

2021 iThome 鐵人賽

DAY 23
1

今天我們要來串接我們之前寫好的 使用者登入 的API連結。


昨天我們已經可以在按鈕綁定的doLogin方法上取得輸入的account&password的值了
接下來我們要開始與之前寫的API登入進行串接,還記得我們之前實作過使用者登入嗎?
忘記的話可以去看之前實作:JWT實作(四)

Angular有提供與後端連接的模組

@angular/common/http:

Most front-end applications need to communicate with a server over the HTTP protocol, to >download or upload data and access other back-end services. Angular provides a client HTTP API >for Angular applications, the HttpClient service class in @angular/common/http.

大意是大部分的前後端連結的應用都可以使用這個模組完成


HttpClient: 提供http連線的物件


好了,介紹完HttpClient的資訊讓我們開始進行實作吧

首先在app.module.ts引入模組


import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { ZingchartAngularModule } from 'zingchart-angular';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { LoginComponent } from './login/login.component';
import { HttpClientModule } from '@angular/common/http';

@NgModule({
  declarations: [
    AppComponent,
    LoginComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    ZingchartAngularModule,
    FormsModule,
    ReactiveFormsModule,
    HttpClientModule #新增模組
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

接著新增一個service用來放置我們要用來負責連線的service

service/http.service.ts


import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

import { HttpParams, HttpHeaders } from '@angular/common/http';
@Injectable({
  providedIn: 'root'
})
export class HttpService {
  private url = 'http://localhost:8080/user/login';
  constructor(private http: HttpClient) { }

  getPosts(account: string, password: string) {
#設置帳號&密碼的參數
    let headers = new HttpHeaders({
      'Content-Type': 'application/json',
      'responseType': 'json'
    });
    let options = {
      headers
    };
    let params = {
      'account': account,
      'password': password
    };

    return this.http.post<any>(this.url, params, options);
  }
}

接著在login.component.ts放入HttpService


import { Component, OnInit } from '@angular/core';
import { FormControl, Validators } from '@angular/forms';
import { HttpService } from '../service/http.service';

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.css']
})
export class LoginComponent implements OnInit {
  title = "登入";
  account = new FormControl('', [Validators.required, Validators.maxLength(10)]); //驗證字數須大於10個字
  password = new FormControl('', [Validators.required, Validators.minLength(3)]);//驗證字數須不少於3個字
  posts: any;
  constructor(private httpService: HttpService) {

  }

  ngOnInit(): void {

  }
  doLogin() {

    this.httpService.getPosts(this.account.value, this.password.value).subscribe(
      (response) => { this.posts = response; console.log(response) },
      (error) => { console.log(error); });
  }
}

接下來我們必須對我們AngularAPI專案進行一些設定


@CrossOrigin(origins = "*", maxAge = 3600)
	@PostMapping("login")
	public APIReturnObject login(@RequestBody User user) {
		APIReturnObject result = new APIReturnObject();
		Map<String, Object> data = new HashMap<String, Object>();
		String token = jWTService.generateToken(user);
		result.setMessage("登入成功,取得token");
		data.put("token", token);
		result.setData(data);
		return result;
	}
    

在我們的登入連結上加上@CrossOrigin的標籤,可以防止等一下登入時發生Access-Control-Allow-Origin的問題


接著讓我們來實際操作啦~!

首先在登入頁上按F12

https://ithelp.ithome.com.tw/upload/images/20211008/20138857MAHse4rD6m.png

輸入我們之前新增過的帳號:ken123 密碼:123 之後點選Login登入鍵
就可以看到

https://ithelp.ithome.com.tw/upload/images/20211008/20138857RwTjmtbfCZ.png

好~那今天先到這邊,明天再繼續囉~!


參考資料

在 Angular 使用 HttpClient 的各種 TypeScript 地雷與陷阱

Angular文件中文版


上一篇
Angular Stock登入(二)(Day22)
下一篇
Angular 路由(Day24)
系列文
Angular+Spring Boot API 處理股市資料32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言